package com.AdvancedDemos.Learn特殊文件;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;
import java.util.function.BiConsumer;

public class 使用Properties读取属性文件 {
    public static void main(String[] args) throws IOException {
        //.properties文件通常作为软件配置文件进行使用
        /*
        .properties文件中,#后面表示行注释
        属性文件的内容都是一些键值对信息，每行都是一个键值对,键必须唯一不能重复
        属性文件的后缀:一般都是.properties结尾的
         */

        /**
         * Properties类是Map接口的一个实现类,专注于字符串键值对的配置文件双列集合
         *
         *接口                  M  a  p
         *                  ↙     ↓     ↘
         *实现类       HashMap   [...]    [...]
         *              ↙         ↓         ↘
         *    LinkedHashMap   Properties    TreeMap
         *
         * Properties 是一个Map集合（键值对集合)，但是我们一般不会当集合使用。
         * 核心作用: Properties是用来代表属性文件的，通过Properties可以读写属性文件里的内容。
         *
         * Properties常用函数:
         * public Properties() --- 用于构建Properties集合对象(空容器)
         * public void load(InputStream is) --- 通过字节输入流，读取属性文件里的键值对数据
         * public void load(Reader reader) --- 通过字符输入流，读取属性文件里的键值对数据
         * public String getProperty(String key) --- 根据键获取值(其实就是get方法的效果)
         * public Set<String> stringPropertyNames() --- 获取全部键的集合（其实就是ketSet方法的效果)
         */


        //1.创建一个Properties的对象出来(键值对集合,空容器)
        Properties properties = new Properties();
        System.out.println(properties);//{}

        //2.开始加载.properties属性文件中的键值对数据到properties对象中
        properties.load(new FileReader(new File("helloworld\\src\\com\\AdvancedDemos\\Learn特殊文件\\users.properties")));
        System.out.println(properties);//{admin=123456, 周芷若=wuji, 赵敏=wuji, 张无忌=minmin}
        System.out.println("----------------");

        //3.根据.properties属性文件中的键取值
        String s1 = properties.getProperty("赵敏");
        String s2 = properties.getProperty("张无忌");
        System.out.println("s1 = " + s1);//s1 = wuji
        System.out.println("s2 = " + s2);//s2 = minmin

        System.out.println("----------------");
        //4.遍历.properties属性文件中全部键和值
        Set<String> keys = properties.stringPropertyNames();
        for (String key : keys) {
            String value = properties.getProperty(key);
            System.out.println(key + "=" + value);
            //admin=123456
            //周芷若=wuji
            //赵敏=wuji
            //张无忌=minmin
        }


        System.out.println("----------------");
        //或者直接properties当做map用forEach遍历
        properties.forEach(new BiConsumer<Object, Object>() {
            @Override
            public void accept(Object key, Object value) {
                System.out.println(key + "=" + value);
                //admin=123456
                //周芷若=wuji
                //赵敏=wuji
                //张无忌=minmin
            }
        });
/*
可以简化为Lambda表达式
(key, value) -> {System.out.println(key + "=" + value);}
 */


    }
}
